package logic.operation;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JProgressBar;

import logic.file.IFile;

//do zaimplementowania funkcjonalności takich funkcjonalności idealny byłby dekorator
//obecnie not used - OGÓLNIEJSZA AbstractFileOperation implemntuje interfejs Observable
//TODO przerobienie na dekorator!!!
public abstract class AbstractObservableFileOperation extends AbstractFileOperation implements Observable {
	
	private List<IOperationObserver> observers = new ArrayList<IOperationObserver>();
	
	AbstractObservableFileOperation() {	}
	
	AbstractObservableFileOperation(List<IFile> files, IOperationObserver observer) {
		this.files = files;
		observers.add(observer);
	}
	
	/**
	 * @param args
	 */
	//klasa abstrakcyjna może mieć, oczywiście, konstruktor
	//jednak może być on wywołany tylko w konstruktorach obiektów dziedziczących po tej klasie
	//TODO część odpowiedzialną za interfejs observable wywalić do jeszcze jednej klasy abstrakcyjnej, po IFileOperation w hierarchii, AbstractFileOperation ją rozszerza i AbstractTransferOperation także
	
	//ponizsze ostatecznie powinnny dzialac na obiektach Observer
	//zastosowac Adapter by przystosowac JProgressBar do interfejsu Observer
	@Override
	public void notifyObservers(double percentDone, String currentFile) {
		for (IOperationObserver progress : observers) {
			progress.update(percentDone, currentFile);
		}
	}
	
	@Override
	public void registerObserver(IOperationObserver observer) {
		observers.add(observer);
		//TODO
	}
	
	@Override 
	public void unregisterObserver(IOperationObserver observer) {
		observers.remove(observer);
	}
	
	@Override
	public void finishedNotifyObservers() {
		for (IOperationObserver progress : observers) {
			progress.finished();
		}
	}

}
